using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._CartographyTools._CartographicRefinement
{
    /// <summary>
    /// <para>Align Marker To Stroke Or Fill</para>
    /// <para>Aligns the marker symbol layers of a point feature class to the nearest stroke or fill symbol layers in a line or polygon feature class within a specified search distance.</para>
    /// <para>在指定的搜索距离内，将点要素类的标记符号图层与线或面要素类中最近的描边或填充符号图层对齐。</para>
    /// </summary>    
    [DisplayName("Align Marker To Stroke Or Fill")]
    public class AlignMarkerToStrokeOrFill : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public AlignMarkerToStrokeOrFill()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_point_features">
        /// <para>Input Point Features</para>
        /// <para>The input point feature layer containing point symbols to be aligned to nearby lines or polygons. Symbols are aligned by storing an angle in the attribute connected to the angle property of the marker symbol layer. This must be connected to a single field with no expression applied.</para>
        /// <para>输入点要素图层包含要与附近线或面对齐的点符号。通过将角度存储在与标记符号图层的 angle 属性相连的属性中来对齐符号。这必须连接到一个不应用表达式的字段。</para>
        /// </param>
        /// <param name="_in_line_or_polygon_features">
        /// <para>Input Line or Polygon Features</para>
        /// <para>The input line or polygon feature layer to which the input point symbols will be aligned.</para>
        /// <para>输入点符号将对齐的输入线或面要素图层。</para>
        /// </param>
        /// <param name="_search_distance">
        /// <para>Search Distance</para>
        /// <para>The search distance from graphical marker edge to graphical stroke or fill edge. A distance greater than or equal to zero must be specified.</para>
        /// <para>从图形标记边缘到图形描边或填充边缘的搜索距离。必须指定大于或等于零的距离。</para>
        /// </param>
        public AlignMarkerToStrokeOrFill(object _in_point_features, object _in_line_or_polygon_features, string? _search_distance)
        {
            this._in_point_features = _in_point_features;
            this._in_line_or_polygon_features = _in_line_or_polygon_features;
            this._search_distance = _search_distance;
        }
        public override string ToolboxName => "Cartography Tools";

        public override string ToolName => "Align Marker To Stroke Or Fill";

        public override string CallName => "cartography.AlignMarkerToStrokeOrFill";

        public override List<string> AcceptEnvironments => ["cartographicCoordinateSystem", "cartographicPartitions", "referenceScale"];

        public override object[] ParameterInfo => [_in_point_features, _in_line_or_polygon_features, _search_distance, _marker_orientation.GetGPValue(), _out_representations];

        /// <summary>
        /// <para>Input Point Features</para>
        /// <para>The input point feature layer containing point symbols to be aligned to nearby lines or polygons. Symbols are aligned by storing an angle in the attribute connected to the angle property of the marker symbol layer. This must be connected to a single field with no expression applied.</para>
        /// <para>输入点要素图层包含要与附近线或面对齐的点符号。通过将角度存储在与标记符号图层的 angle 属性相连的属性中来对齐符号。这必须连接到一个不应用表达式的字段。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Point Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_point_features { get; set; }


        /// <summary>
        /// <para>Input Line or Polygon Features</para>
        /// <para>The input line or polygon feature layer to which the input point symbols will be aligned.</para>
        /// <para>输入点符号将对齐的输入线或面要素图层。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Line or Polygon Features")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_line_or_polygon_features { get; set; }


        /// <summary>
        /// <para>Search Distance</para>
        /// <para>The search distance from graphical marker edge to graphical stroke or fill edge. A distance greater than or equal to zero must be specified.</para>
        /// <para>从图形标记边缘到图形描边或填充边缘的搜索距离。必须指定大于或等于零的距离。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Search Distance")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public string? _search_distance { get; set; }


        /// <summary>
        /// <para>Marker Orientation</para>
        /// <para><xdoc>
        ///   <para>Specifies how the marker symbol layer will be oriented relative to the stroke or fill symbol layer's edge.</para>
        ///   <bulletList>
        ///     <bullet_item>Perpendicular—Marker symbol layers will be aligned perpendicularly to the stroke or fill edge. This is the default.</bullet_item><para/>
        ///     <bullet_item>Parallel—Marker symbol layers will be aligned parallel to the stroke or fill edge.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定标记符号图层相对于描边或填充符号图层边缘的方向。</para>
        ///   <bulletList>
        ///     <bullet_item>垂直—标记符号图层将垂直于描边或填充边对齐。这是默认设置。</bullet_item><para/>
        ///     <bullet_item>平行 - 标记符号图层将平行于描边或填充边缘对齐。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Marker Orientation")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _marker_orientation_value _marker_orientation { get; set; } = _marker_orientation_value._PERPENDICULAR;

        public enum _marker_orientation_value
        {
            /// <summary>
            /// <para>Perpendicular</para>
            /// <para>Perpendicular—Marker symbol layers will be aligned perpendicularly to the stroke or fill edge. This is the default.</para>
            /// <para>垂直—标记符号图层将垂直于描边或填充边对齐。这是默认设置。</para>
            /// </summary>
            [Description("Perpendicular")]
            [GPEnumValue("PERPENDICULAR")]
            _PERPENDICULAR,

            /// <summary>
            /// <para>Parallel</para>
            /// <para>Parallel—Marker symbol layers will be aligned parallel to the stroke or fill edge.</para>
            /// <para>平行 - 标记符号图层将平行于描边或填充边缘对齐。</para>
            /// </summary>
            [Description("Parallel")]
            [GPEnumValue("PARALLEL")]
            _PARALLEL,

        }

        /// <summary>
        /// <para>Updated Input Layer</para>
        /// <para></para>
        /// <para></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Updated Input Layer")]
        [Description("")]
        [Option(OptionTypeEnum.derived)]
        public object _out_representations { get; set; }


        public AlignMarkerToStrokeOrFill SetEnv(object cartographicCoordinateSystem = null, object cartographicPartitions = null, object referenceScale = null)
        {
            base.SetEnv(cartographicCoordinateSystem: cartographicCoordinateSystem, cartographicPartitions: cartographicPartitions, referenceScale: referenceScale);
            return this;
        }

    }

}